package org.example;

/**
 * == Java中比较的是地址，同地址才是相等。
 * 如果没做指定，整数在[-128,127] 之间的数据都是相比都是true。Integer.valueOf代码使用了享元模式，比如Integer a = 7会先检查是否有了7这个整数。
 * 另外对于Boolean对象而言也是享元模式，毕竟只有两个值。
 * 但对Double Float来说就不能是使用 ==来比较两数是否相等了
 * 如下代码：
 *
 * static final int low = -128;
 * static final int high;
 * static final Integer cache[];
 *
 * int h = 127;
 * String integerCacheHighPropValue =
 * VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
 * if (integerCacheHighPropValue != null) {
 * try {
 *     int i = parseInt(integerCacheHighPropValue);
 *     i = Math.max(i, 127);
 *     // Maximum array size is Integer.MAX_VALUE
 *     h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
 *     } catch( NumberFormatException nfe) {
 *     // If the property cannot be parsed into an int, ignore it.
 *     }
 * }
 * high = h;
 *
 * public static Integer valueOf(int i) {
 *         if (i >= IntegerCache.low && i <= IntegerCache.high)
 *             return IntegerCache.cache[i + (-IntegerCache.low)];
 *         return new Integer(i);
 *     }
 *
 */
public class DoubleEqual4IntegerAndBoolean {
    public static void main(String[] args){
        Integer a = -129;
        Integer b = -129;

        System.out.println(a==b); //false

        a = Integer.valueOf(127);
        b = Integer.valueOf(127);

        System.out.println(a==b); //true

//      同样对于Boolean一样，实际就两个值如下。
//        public static final Boolean TRUE = new Boolean(true);
//        public static final Boolean FALSE = new Boolean(false);
//        public static Boolean valueOf(boolean b) {
//            return (b ? TRUE : FALSE);
//        }

        Boolean b1 = true;
        Boolean b2 = true;
        System.out.println(b1 == b2);
    }
}
